/*
 * @Project_description: 数据转换
 */
'use strict'

import {map} from 'tree-lodash'

/**
 * @description 转换数组数据，根据规则将数组中对象的某些字段映射到新的字段名
 * @param {Array} data 原始数据数组
 * @param {Array} rules 转换规则，格式为[{key: '原字段名', value: '新字段名'}]
 * @param {Boolean} [keepOriginal=true] 是否保留原始字段，默认true
 * @return {Array} 转换后的数组
 */
export const transformArrayToDataByRules = (
    data,
    rules,
    keepOriginal = true
) => {
    // 检查参数是否合法，如果参数不合法则直接返回原数据，避免错误
    if (data.length === 0 || rules.length === 0) return data
    // 使用map直接返回新数组，避免修改原数组
    return data.map((item) => {
        // 创建新对象，如果需要保留原始字段则复制原对象，否则创建空对象
        const newItem = keepOriginal ? {...item} : {}
        // 遍历规则进行转换
        rules.forEach((rule) => {
            if (rule.name && rule.value && rule.name !== rule.value) {
                // 只有当原字段存在时才进行映射
                if (item[rule.value] !== undefined) {
                    newItem[rule.name] = item[rule.value]
                }
            }
        })
        return newItem
    })
}


/**
 * @description 转换数组数据，根据规则将数组中对象的某些字段映射到新的字段名
 * @param {Array} data 原始数据tree数组
 * @param {Array} rules 转换规则，格式为[{key: '原字段名', value: '新字段名'}]
 * @param {string} [childrenKey=children] 子节点字段名
 * @return {Array} 转换后的数组
 */
export const transformTreeToDataByRules = (
    data,
    rules,
    childrenKey = 'children'
) => {
    // 检查参数是否合法，如果参数不合法则直接返回原数据，避免错误
    if (data.length === 0 || rules.length === 0) return data
    return map(data, (item) => {
        //循环遍历
        // 遍历规则进行转换
        rules.forEach((rule) => {
            if (rule.name && rule.value && rule.name !== rule.value) {
                // 只有当原字段存在时才进行映射
                if (item[rule.value] !== undefined) {
                    item[rule.name] = item[rule.value]
                }
            }
        })
        return item
    }, {
        childrenKey
    })
}


export default {
    transformArrayToDataByRules,
    transformTreeToDataByRules,
}
